Kestrel 未在 xUnit 测试中收听
Kestrel not listening in xUnit test
我正在使用此自定义服务器进行单元测试,我使用 MyStarup
对其进行初始化,加载我需要进行测试的单个中间件。
这在 net47 之前有效,但在我将项目切换到 .net-core 后它停止了。它现在给了我这个非常有用的异常:
System.Net.Sockets.SocketException
No connection could be made because the target machine actively refused it 127.0.0.1:30001
我使用工厂方法从 IClassFixture
创建它,并使用 HttpClient
调用它,我也使用工厂方法创建它并从同一个夹具中获取它。
public class MyServer : IDisposable
{
private readonly IWebHost _host;
public MyServer(string url) // <-- http://localhost:30001
{
_host =
new WebHostBuilder()
.UseKestrel()
.UseUrls(url)
.UseStartup<MyStartup>()
.Build();
Task = _host.StartAsync(); // <-- tried RunAsync too, no difference
}
public Task Task { get; set; }
public void Dispose()
{
_host.Dispose();
}
}
所以我的问题是,我怎样才能让它再次工作?
我读了这个 为什么 Kestrel 不在指定端口上侦听?
但无助于解决。我不能 运行 它作为一个控制台,它以前工作过。为什么切换到 .net-core 后就停止了?
我明白了。您需要使用自定义配置为 Kestrel
指定 urls
值,否则它会使用一些 随机 (?) 或默认端口 5001
。我不想使用 hosting.json
所以我使用了 InMemoryCollection
public MyServer(string url)
{
var configuration =
new ConfigurationBuilder()
.AddInMemoryCollection(new Dictionary<string, string>
{
["urls"] = url
})
.Build();
_host =
new WebHostBuilder()
.UseKestrel()
//.UseUrls(url) // <-- cannot use this, seems to be deprecated
//.Configure(app => { app.UsePathBase(url); }) // <-- does not work
.UseConfiguration(configuration)
.UseStartup<MyStartup>()
.Build();
Task = _host.StartAsync();
}
我正在使用此自定义服务器进行单元测试,我使用 MyStarup
对其进行初始化,加载我需要进行测试的单个中间件。
这在 net47 之前有效,但在我将项目切换到 .net-core 后它停止了。它现在给了我这个非常有用的异常:
System.Net.Sockets.SocketException No connection could be made because the target machine actively refused it 127.0.0.1:30001
我使用工厂方法从 IClassFixture
创建它,并使用 HttpClient
调用它,我也使用工厂方法创建它并从同一个夹具中获取它。
public class MyServer : IDisposable
{
private readonly IWebHost _host;
public MyServer(string url) // <-- http://localhost:30001
{
_host =
new WebHostBuilder()
.UseKestrel()
.UseUrls(url)
.UseStartup<MyStartup>()
.Build();
Task = _host.StartAsync(); // <-- tried RunAsync too, no difference
}
public Task Task { get; set; }
public void Dispose()
{
_host.Dispose();
}
}
所以我的问题是,我怎样才能让它再次工作?
我读了这个 为什么 Kestrel 不在指定端口上侦听? 但无助于解决。我不能 运行 它作为一个控制台,它以前工作过。为什么切换到 .net-core 后就停止了?
我明白了。您需要使用自定义配置为 Kestrel
指定 urls
值,否则它会使用一些 随机 (?) 或默认端口 5001
。我不想使用 hosting.json
所以我使用了 InMemoryCollection
public MyServer(string url)
{
var configuration =
new ConfigurationBuilder()
.AddInMemoryCollection(new Dictionary<string, string>
{
["urls"] = url
})
.Build();
_host =
new WebHostBuilder()
.UseKestrel()
//.UseUrls(url) // <-- cannot use this, seems to be deprecated
//.Configure(app => { app.UsePathBase(url); }) // <-- does not work
.UseConfiguration(configuration)
.UseStartup<MyStartup>()
.Build();
Task = _host.StartAsync();
}